package com.atguigu.dga.meta.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.dga.meta.bean.PageTableMetaInfo;
import com.atguigu.dga.meta.bean.TableMetaInfo;
import com.atguigu.dga.meta.bean.TableMetaInfoExtra;
import com.atguigu.dga.meta.service.TableMetaInfoExtraService;
import com.atguigu.dga.meta.service.TableMetaInfoService;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.sql.Timestamp;
import java.util.List;

/**
 * <p>
 * 元数据表 前端控制器
 * </p>
 *
 * @author atguigu
 * @since 2023-06-05
 */
@RestController
@RequestMapping("/tableMetaInfo")
public class TableMetaInfoController {
    @Autowired
    private TableMetaInfoExtraService metaInfoExtraService;

    @Autowired
    private TableMetaInfoService metaInfoService;
    /*
    /tableMetaInfo/init-tables/a/2023-06-25
     */
    @PostMapping("/init-tables/{db}/{assessDate}")
    public Object manualInitMetaInfoByDbName(@PathVariable("db") String db,@PathVariable("assessDate") String date) throws Exception {
        //先对这个库下的所有表生成今天考评日期的元数据信息
        metaInfoService.initMetaInfo(db,date);

        //再对这个库下的所有表，生成辅助信息
        metaInfoExtraService.initExtraMetaInfo(db);

        //调用业务模型处理请求
        return "ok";
    }




    /*
            /tableMetaInfo/table-list
            参数：pageNo,pageSize,tableName,schemaName,dwLevel

            前端要求返回数据格式的最外层是：
                { }。java处理方法return的应该是一个Bean，或Map 或 JSONObject
                [ ]:java处理方法return的应该是一个List 或 JSONArray
            分页的规律：pageSize = 20
                       pageNo = 1

                        pageNo = 1   从1条数据开始返回，返回之后的20条。
                       pageNo = 2  从21条数据开始返回，返回之后的20条。

                       from = (pageNo - 1) * 20
     */
    @GetMapping("/table-list")
    public Object queryMetaInfoList(Integer pageNo,Integer pageSize,String tableName,String schemaName,String dwLevel){
        JSONObject result = new JSONObject();

        //计算返回数据的起始行数  从0开始
        int from = (pageNo - 1) * pageSize;

        //调用service查询列表数据
        List<PageTableMetaInfo> metaInfos = metaInfoService.queryTableMetaInfoList(from, pageSize, tableName, schemaName, dwLevel);

        //查询符合条件的总数
        int num = metaInfoService.statsTotalNum(tableName,schemaName,dwLevel);

        //按照要求，封装返回的数据
        result.put("total",num);
        result.put("list",metaInfos);

        return result;
    }

    @GetMapping("/table/{id}")
    public TableMetaInfo queryTableMetaInfo(@PathVariable("id") Long id){
        //根据id查询TableMetaInfo对象
        TableMetaInfo result = metaInfoService.getById(id);
        //根据库名和表名查询额外的元数据信息
        TableMetaInfoExtra metaInfoExtra = metaInfoExtraService.getOne(
                new QueryWrapper<TableMetaInfoExtra>()
                        .eq("table_name", result.getTableName())
                        .eq("schema_name", result.getSchemaName())
        );
        result.setTableMetaInfoExtra(metaInfoExtra);
        return result;
    }

    /*
            json格式的请求参数，要么使用Map 或 Bean接收
                还需要添加@RequestBody
     */
    @PostMapping("/tableExtra")
    public String saveExtraMetaInfo(@RequestBody TableMetaInfoExtra extra){

        //生成更新时间
        extra.setUpdateTime(new Timestamp(System.currentTimeMillis()));
        metaInfoExtraService.updateById(extra);

        return "success";
    }
}














